package zbl.c0.inter;

/**
 * 		全局数据栈，保存全局变量以及各个函数调用时的栈运行环境
 * @author 朱伯龙
 *
 */

public class GlobalStack {

	private static int top;			//	栈顶指针
	
	private static int MAX_DEPTH;	//  最大深度
	
	private static int[] stack;		//  栈内容
	
	
	
	/**
	 * 		初始化建立深度为depth的全局数据栈
	 * @param depth
	 */
	public GlobalStack(int depth){
		MAX_DEPTH = depth;
		top = 0;
		stack = new int[MAX_DEPTH];
	}
	/**
	 * 		添加指定value值的数据到栈顶
	 * @param value
	 */
	public void add(int value){
		if(top < MAX_DEPTH)
			stack[top++] = value;
		else{							//  全局数据栈溢出，无法压栈
			System.out.println("全局数据栈溢出，无法压栈!");
		}
	}
	
	/**
	 * 		入栈但未指定数据，相当于为变量分配存储空间
	 */
	public void push(){
		if(top < MAX_DEPTH)
			top++;
		else{							//  全局数据栈溢出，无法压栈
			System.out.println("全局数据栈溢出，无法压栈!");
		}
	}
	
	/**
	 * 		返回数据栈中指定位置的内容
	 * @param addr
	 * @return
	 */
	public int get(int addr){
		if(addr >= top){				//  位置越界
			System.out.println("全局数据栈访问位置越界!");
			return Integer.MIN_VALUE;
		}else{
			return stack[addr];
		}
	}
	
	/**
	 * 		修改全局数据栈中指定地址的内容
	 * @param addr
	 * @param value
	 */
	public void modify(int addr, int value){
		if(addr >= top){				//  位置越界
			System.out.println("全局数据栈访问位置越界!");
		}else{
			stack[addr] = value;
		}
	}
	
	/**
	 * 		返回当前栈顶的地址
	 * @return
	 */
	public int getAddr(){
		return top;
	}
	
	/**
	 * 		修改数据栈栈顶指针的值   用于函数调用返回时，清空函数的运行数据栈信息
	 * @param value
	 * @return
	 */
	public void setTop(int first_addr){
		top = first_addr;
	}
	/**
	 * 		显示当前全局数据栈的信息
	 */
	public void showStack(){
		System.out.println("************全局数据栈信息***********");
		for(int i=0; i<top; i++)
			System.out.println("("+i+") :   "+stack[i]);
		System.out.println("************************************");
	}
}
